package com.yeban.javase.day08.test02;

import java.util.Arrays;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/10
 *
 * 属性:
 * 1.当前所有的账户对象的信息,存放在数组中: Account[].
 * 2.当前账户数量index.
 * insert(Account acc)   扩容
 * selectOne(Long id,String pwd)
 * selectOne(Long id)
 * selectAll()
 * delete(Long id)         ？？？ 慎写
 * update(Account acc)  ？？？ 基于内存来操作的，数组、集合的存储方式，需要更新操作么？
 */
public class ArrayDao implements IDao<Account, Account[]> {

    private Account[] accs;            // 当前所有账户信息
    private static int index;          // 当前账户数量

    public ArrayDao() {
        this.accs = new Account[10];
        ArrayDao.index = 0;

        // 预置账户数据
        insert(new Account(20251001L, "张三"));
        insert(new Account(20251002L, "李四"));
        insert(new Account(20251003L, "王五"));
    }

    // 初始ID
    private Long id = 862150212025109998L;

    @Override
    public Long getId() {
        return 0L;
    }

    @Override
    public void setId(Long id) {

    }

    @Override
    public Long createID() {
        return IDao.super.createID();
    }

    /**
     * 添加新的账号信息，账号数组扩容
     */
    public boolean insert(Account acc) {

        // 1.判断是否需要扩容
        if(index >= accs.length) {
            accs = Arrays.copyOf(accs,accs.length*3/2+1);
        }

        // 2.插入新账户
        accs[index++] = acc;
        return true;
    }

    /**
     * 根据账户id和密码pwd，查看账户信息
     * 登录验证 / 取钱
     */
    @Override
    public Account selectOne(Long id, String pwd) {

        // 局部变量index
        int foundIndex = -1;

        // 找到目标存储账户信息的数组索引
        for(int i = 0; i < accs.length; i++) {
            // 数组所在位置账户对象是否存在 && 是否对应id，一旦找到账户，即可返回
            if(accs[i] != null && accs[i].getId().equals(id)) {
                foundIndex = i;
                break;
            }
        }

        // 遍历到最后仍然为-1，说明账户不存在
        if(foundIndex == -1) {
            System.out.println("账户不存在：" + id);
            return null;
        }

        // 如果找到了该账户，验证密码是否正确
        Account acc = accs[foundIndex];
        if(acc.getPassword() == null || !acc.getPassword().equals(pwd)) {
            System.out.println("密码错误！请重新输入！");
            return null;
        }
        System.out.println("密码校验成功！");
        return acc;
    }

    /**
     * 根据账户id，查看账户信息
     * 存钱
     */
    @Override
    public Account selectOne(Long id) {

        // 局部变量index
        int foundIndex = -1;

        // 判断id对应的账号是否存在 && id是否对应
        for(int i = 0; i < accs.length; i++) {
            if(accs[i] != null && accs[i].getId().equals(id)) {
                // 如果找到了，就退出循环
                foundIndex = i;
                break;
            }
        }

        if(foundIndex == -1) {
            System.out.println("账号不存在！请重新查找！");
        }

        // 通过索引找到对应的账户，
        return accs[foundIndex];
    }


    /**
     * 修改指定账户的信息
     */
    public Account upDate(Account acc) {

        int index = 0;
        for (int i = 0; i < accs.length; i++) {
            if(accs[i].getId().equals(acc.getId())) {
                index = i;
            }
        }

        // 更新账户信息
        accs[index] = acc;
        return accs[index];
    }

    /**
     * 查询所有账户，统计用的
     */
    @Override
    public Account[] selectAll() {
        return accs;
    }

    /**
     * 获取
     * @return accounts
     */
    public Account[] getAccounts() {
        return accs;
    }

    /**
     * 设置
     * @param accounts
     */
    public void setAccounts(Account[] accounts) {
        this.accs = accounts;
    }

    /**
     * 获取
     * @return index
     */
    public int getIndex() {
        return index;
    }

    /**
     * 设置
     * @param index
     */
    public void setIndex(int index) {
        this.index = index;
    }

    public String toString() {
        return "ArrayDao{accounts = " + accs + ", index = " + index + "}";
    }
}
